/**
 * new KVue({data: {}})
 */
class KVue {
    constructor(options) {
        this.$options = options;
        // 数据响应化
        this.$data = options.data;
        this.observe(this.$data);
    }

    observe(value) {
        if (!value || typeof value !== 'object') {
            return;
        }

        // 遍历对象
        Object.keys(value).forEach(key => {
            this.defineReactive(value, key, value[key])
        })
    }

    // 数据响应函数
    defineReactive(obj, key, val) {

        // 解决对象数据嵌套
        this.observe(val);

        // 初始化Dep
        const dep = new Dep();

        // 数据劫持
        Object.defineProperty(obj, key, {
            get() {
                Dep.target && dep.addDep(Dep.target);
                return val;
            },
            set(newVal) {
                if (newVal === val) {
                    return;
                } else {
                    val = newVal;
                    // console.log(`${key}属性更新了: ${val}`);
                    dep.notify();
                }
            }
        })
    }
}

/**
 * Dep: 用来管理Watcher
 */
class Dep {
    constructor() {
        // 这里存在若干依赖（watcher）
        this.deps = [];
    }

    addDep(dep) {
        this.deps.push(dep);
    }

    notify() {
        this.deps.forEach(dep => dep.update())
    }
}

/**
 * Watcher
 */
class Watcher {
    constructor() {
        // 将当前watcher实例指定到Dep[静态]属性target
        Dep.target = this;
    }

    update() {
        console.log("属性更新");
    }
}



























